package dao;

import utils.JDBCUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.List;

/**
 * Date:2022/2/28
 * Author:ybc
 * Description:
 * 抽象增删改查功能的父类
 * T表示当前操作表所对应实体类类型
 */
public class BaseDao<T> {

    QueryRunner queryRunner = new QueryRunner();

    /**
     * 将查询的一条数据转换为实体类对象
     * @param clazz：查询的数据要转换的实体类类型的Class对象
     * @param sql：要执行的SQL语句
     * @param params：按顺序为SQL语句的通配符所赋的值
     * @return
     */
    public T getBean(Class<T> clazz, String sql, Object... params) {
        Connection connection = null;
        T t = null;
        try {
            connection = JDBCUtils.getConnection();
            //BeanHandler将结果集中的数据转换为实体类对象
            t = queryRunner.query(connection, sql, new BeanHandler<>(clazz), params);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.closeConnection(connection);
        }
        return t;
    }

    /**
     * 将查询的多条数据转换为实体类对象的集合
     * @param clazz：查询的数据要转换的实体类类型的Class对象
     * @param sql：要执行的SQL语句
     * @param params：按顺序为SQL语句的通配符所赋的值
     * @return
     */
    public List<T> getBeanList(Class<T> clazz, String sql, Object... params) {
        Connection connection = null;
        List<T> list = null;
        try {
            connection = JDBCUtils.getConnection();
            //BeanListHandler将结果集中的多条数据转换为list集合
            list = queryRunner.query(connection, sql, new BeanListHandler<>(clazz), params);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.closeConnection(connection);
        }
        return list;
    }

    /**
     * 查询单行单列的值
     * @param sql：要执行的SQL语句
     * @param params：按顺序为SQL语句的通配符所赋的值
     * @return
     */
    public Object getSingleData(String sql, Object... params) {
        Connection connection = null;
        Object o = null;
        try {
            connection = JDBCUtils.getConnection();
            //ScalarHandler将结果集中单行单列的值转换为Java数据
            o = queryRunner.query(connection, sql, new ScalarHandler<>(), params);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.closeConnection(connection);
        }
        return o;
    }

    /**
     * 实现增删改功能
     * @param sql：要执行的SQL语句
     * @param params：按顺序为SQL语句的通配符所赋的值
     * @return：增删改统一的返回值，受影响的行数
     */
    public int update(String sql, Object... params) {
        Connection connection = null;
        int result = 0;
        try {
            connection = JDBCUtils.getConnection();
            result = queryRunner.update(connection, sql, params);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.closeConnection(connection);
        }
        return result;
    }

    /**
     * 实现增删改功能
     * @param sql：要执行的SQL语句
     * @param params：按顺序为SQL语句的通配符所赋的值
     * @return：增删改统一的返回值，受影响的行数
     */
    public int updateOld(String sql, Object... params) {
        Connection connection = null;
        PreparedStatement ps = null;
        int result = 0;
        try {
            connection = JDBCUtils.getConnection();
            ps = connection.prepareStatement(sql);
            for (int i = 0; i < params.length; i++) {
                ps.setObject(i+1, params[i]);
            }
            result = ps.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.closeConnection(connection);
        }
        return result;
    }

}
